package com.atom.module.coroutine.core

import com.atom.module.coroutine.dispatcher.Dispatcher
import java.util.concurrent.LinkedBlockingDeque
import kotlin.coroutines.CoroutineContext

typealias EventTask = () -> Unit

// 创建一个 基于链表的队列的分发分发者 ， 可以进行入队操作，以及分发操作
class BlockingQueueDispatcher : LinkedBlockingDeque<EventTask>(), Dispatcher {
    // 该分发的 主要行为是将 任务的执行 也就是  () -> Unit 该闭包 进行入队操作
    override fun dispatch(block: EventTask) {
        offer(block)
    }
}

class BlockingCoroutine<T>(
    context: CoroutineContext,
    private val eventQueue: LinkedBlockingDeque<EventTask>
) : AbstractCoroutine<T>(context) {

    fun joinBlocking(): T {
        while (!isCompleted) {
            eventQueue.take().invoke()
        }
        return (state.get() as CoroutineState.Complete<T>).let {
            it.value ?: throw it.exception!!
        }
    }
}